/*
		字符串函数的使用以及strlen、strcpy的模拟实现

		夏思成

		2024年3月26日

		西科大15号公寓楼
*/




////strlen函数的使用
//int main()
//{
//	int arr[] = "abcdef";
//	size_t len = strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}

//模拟strlen函数的实现
//
////1.计数器法
//
//#include <stdio.h>
//
//size_t my_strlen(const char* arr)
//{
//  assert(arr);//判断所传字符串是否为NULL
//	size_t count = 0;
//	while (*arr != '\0')
//	{
//		count++;
//		arr++;
//	}
//	return count;
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}


////2.不能创建临时变量，递归法
//
//#include <stdio.h>
//#include <assert.h>
//
//size_t my_strlen(const char* arr)
//{
//	assert(arr);//判断所传字符串是否为NULL
//	if (*arr != '\0')
//	{
//		return 1 + my_strlen(arr + 1);
//	}
//	else
//	{
//		return 0;
//	}
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}



////3.指针-指针
//
//#include <stdio.h>
//#include <assert.h>
//
//size_t my_strlen(const char* arr)
//{
//	assert(arr);//判断所传地址是否为NULL
//
//	char* p1 =(char*) arr;//记录首地址
//	char* p2 = NULL;//记录末尾
//
//	while (*arr++ != '\0')
//	{
//		;
//	}
//	p2 = (char*)arr - 1;//当退出循环后，arr指向的'\0'的位置，所以字符串的末尾应该是arr-1
//	return p2 - p1;
//}
//
//int main()
//{
//	char arr[] = "abcdef";
//	size_t len = my_strlen(arr);
//	printf("%zd\n", len);
//	return 0;
//}

//
//#include <stdio.h>
//#include <string.h>
//
////strcpy的使用
//int main()
//{
//	char arr1[] = "abcdef";
//	char arr2[20] = "xxxxxxxxxxx";
//	char * ret = strcpy(arr2, arr1);
//	printf("%s\n", ret);
//	return 0;
//}


//strcpy函数的模拟实现

#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* destination, const char* source)
{
	assert(destination && source);//判断传来的地址是否为空
	
	char* ret = destination;//记录目标字符串的首地址

	while (*destination++ = *source++)//将来源字符串的每个字符赋给目标字符串
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	char* ret = my_strcpy(arr2, arr1);
	printf("%s\n", ret);
	return 0;
}